package com.pubinfo.passbook.engine.chain.transfer;

import com.pubinfo.passbook.common.model.dto.witeoff.MedicineOnJobOrRetireDTO;
import com.pubinfo.passbook.common.model.ruler.PayInformation;
import com.pubinfo.passbook.engine.chain.ComputeChain;
import com.pubinfo.passbook.engine.constants.ComputeChainType;
import com.pubinfo.passbook.engine.constants.ComputeResultType;
import lombok.NonNull;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;

/**
 * 计算链转换工具
 *
 * @author zhouch
 * @date 2021/12/15 9:00
 */
public final class TransferUtils {

    /**
     * 将计算链转化为计算单元，如果不符合转换条件返回空
     *
     * @param chain           要转化的计算链
     * @param targetChainType 期望的目标类型计算链
     * @return
     */
    public static ComputeChainTransfer<?, ?, ?> convertTargetChainType(
            @NonNull ComputeChain<?, ?> chain,
            @NonNull String targetChainType) {

        //检查计算链类型是否可以兼容，如不兼容则返回空

        // 计算链转化目标是医药费计算链的情况
        if (targetChainType.contentEquals(ComputeChainType.MEDICINE)) {

            // 将医药费子单计算链转为医药费计算单元
            if (chain.getChainType().contentEquals(ComputeChainType.MEDICINE_SUB_LOOP)) {
                return new MedicineToSubTransfer((ComputeChain<PayInformation, BigDecimal>) chain);
            }
        }

        // 如果是目标类型和计算链类型都相同的情况, 说明不存在特殊的数据转化
        // 直接使用SimpleTransfer转成该计算链类型的计算单元即可
        if (targetChainType.contentEquals(chain.getChainType())) {
            return new SimpleTransfer<>(chain, targetChainType, chain.getResultType());
        }

        return null;
    }
}
